package com.ysh.xiaomi.service.impl;

import com.ysh.xiaomi.dao.UserDao;
import com.ysh.xiaomi.dao.impl.UserDaoImpl;
import com.ysh.xiaomi.pojo.TbAddress;
import com.ysh.xiaomi.pojo.TbUser;
import com.ysh.xiaomi.service.UserService;
import com.ysh.xiaomi.utils.EmailUtils;
import com.ysh.xiaomi.utils.MD5Utils;

import java.util.UUID;
import java.util.concurrent.CompletableFuture;

/**
 * 袁胜虎 on 2022/8/16 8:49
 */
public class UserServiceImpl implements UserService {
    UserDao dao = new UserDaoImpl();
    @Override
    public int AddUser(TbUser tbUser) {
        //设置数据
        //修改密码为MD5
        tbUser.setPassword(MD5Utils.md5(tbUser.getPassword()));
        //设置code,这个code是一个随机的内容,并不是真正的随机数,这个code 的目的是和用户绑定,激活的时候通过code来区分谁在激活
        //激活的时候需要传递code过来,我们一般发送邮件的时候会将code带过去,用户点击链接的时候会带着code回来
        tbUser.setCode(UUID.randomUUID().toString().replace("-",""));
        //添加到数据库
        int result = dao.AddUser(tbUser);
        //发送邮件
        //发送邮件如果失败了,注册要回滚吗?不需要,现在我们有一个后续的操作,这个操作属于核心操作吗,不属于核心操作,并且这个操作的成功失败不影响核心操作
        //结合上面的分析,我们发送邮件可以设置为异步操作
        System.err.println(Thread.currentThread().getName());
        CompletableFuture.runAsync(()->{
            //把我们要执行的操作歇过来
            EmailUtils.sendEmail(tbUser);
        });
        return result;
    }

    @Override
    public int AddAddress(TbAddress address) {
        return dao.AddAddress(address);
    }

    @Override
    public TbUser login(String username, String password) {
        //按照用户名查询
        TbUser user = dao.findByUser(username);
        if (user!=null){
            //获取到查询到的密码
            String userPassword = user.getPassword();
            //将输入的密码转成md5
            String md5 = MD5Utils.md5(password);
            if (userPassword.equalsIgnoreCase(md5)){
                //如果密码一致就返回
                return user;
            }
        }
        return null;
    }

    @Override
    public int updateLoginTime(Long userId) {
        return  dao.updateLoginTime(userId);
    }

    @Override
    public TbUser adminLogin(String username, String password) {
        TbUser user = dao.selectByUsername(username);
        if(user == null){
            return null;
        }
        if(user.getRole()!=0){
            return null;
        }
        if(!user.getPassword().equals(MD5Utils.md5(password))){
            return null;
        }
        return user;
    }
}
